package controller;

import eccezioni.CampoErratoException;
import eccezioni.UtenteBannatoException;
import eccezioni.UtenteGiaRegistratoException;
import eccezioni.UtenteGiaVerificatoException;
import eccezioni.UtenteNonTrovatoException;
import entity.UtenteRegistrato;
import javax.ejb.Local;

/**
 * Metodi per la registrazione dell'utente
 * @author Ale
 */
@Local
public interface ControllerUserRegistrationLocal {

    /**
     * Metodo per registrare un nuovo utente
     * @param mail indirizzo e-mail per la registrazione, identifica l'utente in modo univoco all'interno del sistema
     * @param password password per l'accesso, null se la registrazione è social (si veda il parametro sito)
     * @param password2 conferma della password per l'accesso, null se la registrazione è social (si veda il parametro sito)
     * @param nome nome del nuovo utente
     * @param cognome cognome del nuovo utente
     * @param indirizzo indirizzo del nuovo utente
     * @param telefono numero di telefono del nuovo utente
     * @param paypal mail dell'account paypal del nuovo utente
     * @param sito true sse la registrazione non è social (cioè è avvenuta direttamente sul sito, non utilizzando OpneId né Facebook)
     * @return il nuovo utente
     * @throws UtenteBannatoException se l'utente cerca di ri-registrarsi dopo essere stato bannato
     * @throws UtenteGiaRegistratoException se l'utente cerca di ri-registrarsi ma è già registrato
     * @throws CampoErratoException se uno o più dati forniti non sono nel formato corretto
     */
    UtenteRegistrato inserisciUtente(String mail, String password, String password2, String nome, String cognome, String indirizzo, String telefono, String paypal, boolean sito) throws UtenteBannatoException, UtenteGiaRegistratoException, CampoErratoException;

    /**
     * Ricerca un utente in base all'uuid che gli viene fornito in fase di registrazione
     * @param uid id casuale e univoco assegnato all'utente in fase di registrazione
     * @return l'utente corrispondente, se esiste
     */
    public UtenteRegistrato findUser(String uid);

    /**
     * Verifica un utente non verificato, completandone così la registrazione
     * @param uid l'uuid dell'utente da verificare
     * @return l'utente ora verificato
     * @throws UtenteBannatoException se l'utente cerca di ri-verificarsi dopo essere stato bannato
     * @throws UtenteNonTrovatoException se l'utente non viene trovato
     * @throws UtenteGiaVerificatoException se l'utente si ri-verifica dopo essere già stato verificato
     */
    public UtenteRegistrato verifica(String uid) throws UtenteBannatoException, UtenteNonTrovatoException, UtenteGiaVerificatoException;

    /**
     * Modifica l'uuid dell'utente specificato con il nuovo uuid in input
     * @param uuid nuovo uuid
     * @param utente utente il cui uuid viene modificato
     */
    void changeUUID(String uuid, UtenteRegistrato utente);
    
}
